์ž‘์„ฑ: 2026-03-04 02:23:35์ˆ˜์ •: 2026-03-04 02:41:03

Java Swing ๋ฐ์ดํ„ฐ ์—ฐ๋™: UI์™€ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์—ฐ๊ฒฐํ•˜๊ธฐ

์ž๋ฐ” ์Šค์œ™(Java Swing) ๊ฐœ๋ฐœ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์›์น™ ์ค‘ ํ•˜๋‚˜๋Š” ํ™”๋ฉด(View)๊ณผ ๋ฐ์ดํ„ฐ(Model)์˜ ๋ถ„๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ปดํฌ๋„ŒํŠธ์— ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜, ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ํ™œ์šฉํ•ด UI๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


1. ํ…์ŠคํŠธ ํ•„๋“œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ๊ฐ์‹œ

์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์ง€ํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • ๊ฐ€์ ธ์˜ค๊ธฐ: textField.getText()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์‹ค์‹œ๊ฐ„ ๊ฐ์‹œ: DocumentListener๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธ€์ž๊ฐ€ ์ž…๋ ฅ๋  ๋•Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
JTextField textField = new JTextField();
textField.getDocument().addDocumentListener(new DocumentListener() {
    public void changedUpdate(DocumentEvent e) { update(); }
    public void removeUpdate(DocumentEvent e) { update(); }
    public void insertUpdate(DocumentEvent e) { update(); }
 
    public void update() {
        System.out.println("์ž…๋ ฅ ๋‚ด์šฉ: " + textField.getText());
    }
});

2. ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ์—ฐ๋™ (JTable๊ณผ TableModel)

์Šค์œ™์—์„œ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ธ **JTable**์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋„ฃ์ง€ ์•Š๊ณ  ๋ฐ˜๋“œ์‹œ **TableModel**์„ ํ†ตํ•ด ์—ฐ๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ‘  ๊ธฐ๋ณธ ๋ฐฉ์‹ (DefaultTableModel)

๊ฐ€์žฅ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€/์‚ญ์ œํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

String[] columns = {"ID", "์ด๋ฆ„", "์ด๋ฉ”์ผ"};
DefaultTableModel model = new DefaultTableModel(columns, 0);
JTable table = new JTable(model);
 
// ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
model.addRow(new Object[]{"1", "ํ™๊ธธ๋™", "[email protected]"});
 
// ๋ฐ์ดํ„ฐ ์‚ญ์ œ (์ฒซ ๋ฒˆ์งธ ํ–‰)
model.removeRow(0);

โ‘ก ๊ณ ๊ธ‰ ๋ฐฉ์‹ (AbstractTableModel)

์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ์ฒด(List<User> ๋“ฑ)์™€ ํ…Œ์ด๋ธ”์„ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์›๋ณธ์ด ๋ฐ”๋€Œ๋ฉด ํ™”๋ฉด์ด ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ๋˜๋„๋ก ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


3. UI ์—…๋ฐ์ดํŠธ ์‹œ ์ฃผ์˜์‚ฌํ•ญ (๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ๋„คํŠธ์›Œํฌ์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ UI์— ๋ฟŒ๋ ค์ค„ ๋•Œ๋Š” ํ•ญ์ƒ **EDT(Event Dispatch Thread)**๋ฅผ ๊ฑฐ์ณ์•ผ ํ•จ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.

// ๋ณ„๋„ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„
List<User> userList = db.findAllUsers();
 
// UI ์—…๋ฐ์ดํŠธ๋Š” ๋ฐ˜๋“œ์‹œ SwingUtilities๋ฅผ ์‚ฌ์šฉ
SwingUtilities.invokeLater(() -> {
    for (User user : userList) {
        model.addRow(new Object[]{user.getId(), user.getName()});
    }
});

4. ์‹ค๋ฌด ํŒจํ„ด: POJO์™€ UI ์‹ฑํฌ ๋งž์ถ”๊ธฐ

๋‹จ์ˆœํžˆ getText()๋ฅผ ์“ฐ๋Š” ๊ฒƒ๋ณด๋‹ค, ๋ณ„๋„์˜ **๋ฐ์ดํ„ฐ ๊ฐ์ฒด(POJO)**๋ฅผ ์ •์˜ํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ’์„ ๊ฐ์ฒด์— ๋‹ด์•„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  1. ํ™”๋ฉด โ†’ ๊ฐ์ฒด: '์ €์žฅ' ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ชจ๋“  ํ…์ŠคํŠธ ํ•„๋“œ์˜ ๊ฐ’์„ User ๊ฐ์ฒด์— ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฐ์ฒด โ†’ ํ™”๋ฉด: '์ˆ˜์ •' ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ User ๊ฐ์ฒด์˜ ๊ฐ’์„ ๊ฐ ํ…์ŠคํŠธ ํ•„๋“œ์— setText() ํ•ด์ค๋‹ˆ๋‹ค.

5. ์š”์•ฝ

  • ๊ฐ„๋‹จํ•œ ์ž…๋ ฅ์€ **getText() / setText()**๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณต์žกํ•œ ๋ชฉ๋ก(Table, List)์€ ๋ฐ˜๋“œ์‹œ Model ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ UI์— ์—ฐ๋™ํ•  ๋•Œ๋Š” ์Šค๋ ˆ๋“œ ๋ถ„๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ์™€ ํ™”๋ฉด์„ ๋ถ„๋ฆฌํ•˜๋Š” ์Šต๊ด€์€ ๋Œ€๊ทœ๋ชจ ์Šค์œ™ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.